package com.qdlc.p2p.biz.service;

import java.util.List;

import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.BorrowCollection;
import com.qdlc.p2p.dal.dto.BorrowTender;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.model.BorrowCollectionModel;
import com.qdlc.p2p.dal.model.BorrowModel;
import com.qdlc.p2p.dal.model.BorrowTenderModel;
import com.qdlc.p2p.dal.model.interest.InterestCalculator;

/**
 * 待收Service
 *
 * @author sj
 * @version 2.0
 * @since 2014年2月26日15:31:10
 */
public interface BorrowCollectionService {

    void save(List<BorrowCollection> list);

    /**
     * 已赚利息
     *
     * @param userId
     * @return
     */
    double getReceivedInterestSum(long userId);

    /**
     * 分页
     *
     * @param model
     * @return
     */
    PageDataList<BorrowCollectionModel> list(BorrowCollectionModel model);

    /**
     * 获取待收的统计信息
     *
     * @param userId 用户ID
     * @return 待收的统计信息
     */
    BorrowCollectionModel getCollectStatistics(long userId);

    /**
     * @param user
     * @return
     */
    List<BorrowCollectionModel> investCollectionList(User user);

    /**
     * 根据用户获取待收利息总额
     *
     * @param user
     * @return 待收利息总额
     */
    double getInterestByUser(User user);

    /**
     * 根据用户和时间获取待收利息总额
     *
     * @param user 用户 date 时间
     * @return 待收利息日期和金额
     */
    List<Object[]> getInterestByUserAndDate(User user, String date);

    /**
     * 根据用户获取待收本金总额
     *
     * @param user
     * @return 待收本金总额
     */
    double getCapitalByUser(User user);

    /**
     * 根据用户和时间获取待收本金总额
     *
     * @param user 用户 date 时间
     * @return 待收本金日期和金额
     */
    List<Object[]> getCapitalByUserAndDate(User user, String date);

    /**
     * 用户月份代收时间统计
     *
     * @param user 信息
     * @return
     */
    List<String> getCollectionDate(User user);

    /**
     * 借款标回款计划
     *
     * @param model
     * @return
     */
    PageDataList<BorrowCollectionModel> getRepayPlanByModel(
            BorrowTenderModel model);

    /**
     * 获取当前借款标回款计划
     *
     * @param model
     * @return
     */
    PageDataList<BorrowCollectionModel> getCurrentRepayPlanByModel(BorrowTenderModel model);

    /**
     * 根据tender_id获取所有待收记录利息，本金和
     *
     * @param tenderId
     * @return
     */
    Object[] getBorrowCollectionList(long tenderId);

    /**
     * 根据投标和利息计算器生成借款代收记录
     *
     * @param tender     投标
     * @param calculator 利息计算器
     * @param award      投标奖励
     * @return 代收记录列表
     * @author Kaiju Zhao
     */
    List<BorrowCollection> createCollectionList(BorrowTender tender, InterestCalculator calculator, double award);

    /**
     * 根据用户Id与startDate返回一个月收益的分组信息
     */
    List<Object[]> getInterestByMonth(long userId, String startDate);

    /**
     * 根据用户Id与startDate返回一个月总的待收收益
     */
    double getAmountInterestByMonth(long userId, String startDate);

    /**
     * 根据用户Id与startDate返回一个月总的已回款
     */
    double getAmountRepaymentByMonth(long userId, String startDate);
}
